﻿using DbSQLite;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using CoreCommon;
using System.Text;
using System.Data;
using System.Globalization;


namespace gte
{
    class SQL_Fetch : DbFacadeSQLite
    {
        #region Внешние поля

        /// <summary>
        /// Идентификтор записи в базе данных
        /// </summary>
        public int ID { get { return _id; } set { _id = value; } }

        /// <summary>
        /// Время внесения записи в базу данных
        /// </summary>
        public DateTime DT { get { return _dt; } set { _dt = value; } }

        /// <summary>
        /// Имя запроса к базе данных
        /// </summary>
        public string Name { get { return _name; } set { _name = value; } }

        /// <summary>
        /// Текст запроса к базе данных
        /// </summary>
        public string SqlText { get { return _sql_text; } set { _sql_text = value; } }

        /// <summary>
        /// Путь к папке выгрузки сформированных файлов Excel
        /// </summary>
        public string PathF { get { return _path_f; } set { _path_f = value; } }

        /// <summary>
        /// Путь к шаблону файла Excel
        /// </summary>
        public string PathE { get { return _path_e; } set { _path_e = value; } }

        /// <summary>
        /// Таблица сопоставления полей запроса ячейкам шаблона Excel
        /// </summary>
        public string Comparer { get { return _comparer; } set { _comparer = value; } }

        #endregion

        #region Методы класса

        /// <summary>
        /// Сохранение состояния объекта в виде записи в базе данных
        /// </summary>
        /// <returns>Идентификатор записи в базе</returns>
        public int SaveToDb()
        {
            ParametersCollection parameters = new ParametersCollection();
            parameters.Add("name", _name, DbType.String);
            parameters.Add("sql_text", _sql_text, DbType.String);
            parameters.Add("path_f", _path_f, DbType.String);
            parameters.Add("path_e", _path_e, DbType.String);
            parameters.Add("comparer", _comparer, DbType.String);
            parameters.Add("data_sql", _data_sql, DbType.String);
            parameters.Add("dt", _dt, DbType.DateTime);

            return base.Insert("fetch", parameters); //вставка одной записи 
        }

        public int EditRowDb()
        {
            ParametersCollection parameters = new ParametersCollection();
            parameters.Add("name", _name, DbType.String);
            parameters.Add("sql_text", _sql_text, DbType.String);
            parameters.Add("path_f", _path_f, DbType.String);
            parameters.Add("path_e", _path_e, DbType.String);
            parameters.Add("comparer", _comparer, DbType.String);
            parameters.Add("data_sql", _data_sql, DbType.String);
            parameters.Add("dt", _dt, DbType.DateTime);

            return base.Update("fetch", parameters, String.Format("id = {0}", _id)); 
        }

        /// <summary>
        /// Возвращается экземпляр класса по запрошенному идентификтору из базы данных
        /// </summary>
        /// <param name="id">Идентификатор записи в базе данных</param>
        /// <returns>Экземпляр класса с заполненными полями</returns>
        public static SQL_Fetch Load(int id)
        {
            ParametersCollection parameters = new ParametersCollection();
            parameters.Add("id", id, DbType.Int32);

            SQL_Fetch sq = new SQL_Fetch();
            DataTable db = sq.Execute("select id, name, sql_text, path_f, path_e, comparer, data_sql, dt from fetch where id = @id", parameters);
            if (db == null)
                throw new CoreException(ErrType.Message, sq.LastError);

            if (db.Rows.Count > 0)
            {
                sq._id = Convert.ToInt32(db.Rows[0]["id"], CultureInfo.InvariantCulture);
                sq._name = db.Rows[0].Field<string>("name");
                sq._sql_text = db.Rows[0].Field<string>("sql_text");
                sq._path_f = db.Rows[0].Field<string>("path_f");
                sq._path_e = db.Rows[0].Field<string>("path_e");
                sq._comparer = db.Rows[0].Field<string>("comparer");
                sq._data_sql = db.Rows[0].Field<string>("data_sql");
                sq._dt = db.Rows[0].Field<DateTime>("dt");
            }
            return sq;
        }

        /// <summary>
        /// Удаляется из базы выборка по заданному id
        /// </summary>
        /// <param name="id">Идентификатор выборки</param>
        public static void Delete(int id)
        {
            SQL_Fetch sq = new SQL_Fetch();
            sq.ExecuteNonQuery(String.Format("delete from fetch where id = {0}", id));
        }

        /// <summary>
        /// Загружается список выборок
        /// </summary>
        /// <returns>Список выборок</returns>
        public static List<ComboBoxItem> LoadFetchesName()
        {
            SQL_Fetch sq = new SQL_Fetch();
            DataTable db = sq.Execute("select id, name from fetch");

            List<ComboBoxItem> ls = new List<ComboBoxItem>();

            foreach (DataRow dr in db.Rows)
                ls.Add(new ComboBoxItem(Convert.ToInt32(dr["id"], CultureInfo.InvariantCulture), dr["name"].ToString()));
            
            return ls;
        }

        #endregion

        #region Constructors

        public SQL_Fetch() : base(Const.APP_DB)
        {

            if (!File.Exists(Const.APP_DB) || new FileInfo(Const.APP_DB).Length == 0)
            {
                base.ExecuteNonQuery(@"CREATE TABLE [fetch] (
                    [id] integer PRIMARY KEY AUTOINCREMENT NOT NULL,
                    [name] TEXT NOT NULL,
                    [sql_text] TEXT NOT NULL,
                    [path_f] TEXT NOT NULL,
                    [path_e] TEXT NOT NULL,
                    [comparer] TEXT NOT NULL,
                    [data_sql] TEXT NOT NULL,
                    [dt] DateTime NOT NULL
                    )");
            }
        }

        #endregion

        #region Private Fields

        private int _id = 0;
        private string _name = "";
        private string _sql_text = "";
        private string _path_f = "";
        private string _path_e = "";
        private string _comparer = "";
        private string _data_sql = "";
        private DateTime _dt = DateTime.Now;
       
        #endregion
    }
}
